#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import sqlite3
import threading 

class StringDatabaseManager:
    """负责数据库操作"""

    #resType资源文件的类型 分为：
    #（1) 普通字符类型string  类型编号为1
    #（2）字符数组string-array 类型编号为2
    # (3) 大致数字符类型plurals 类型编号为3
    REGISTER_SQL = '''create table register(
        id integer primary key autoincrement,
        name text not null,
        resType integer,
        msgid integer default -1,
        formatted integer default -1,
        translatable integer default -1,
        typeId integer default -1
        );
        '''

    TRANSLATE_SQL = '''create table translate(
            id integer primary key autoincrement,
            name text not null,
            language text,
            content text,
            orderNum integer default -1,
            msgid integer default -1
            );
            '''

    def __init__(self,dbName,existAndDelete):
        '''
        检查数据库是否存在，如果存在直接打开，如果不存在先创建数据库，建表
        dbName 数据库名称
        existAndDelete 如果为True，则在该文件已经存在的情况下会先删除，否则直接打开
        '''
        self.mDbName = dbName
        self.mDbFilePath = os.environ["OAS_PATH"] + os.path.sep + "data" + os.path.sep +  self.mDbName + ".db"
        self.mLock = threading.Lock() #线程锁
        if not self.checkDbFileExist():     #数据库不存在
            self.createDb()     #创建数据库
            if not self.checkDbFileExist():  #如果还不存在，说明读写权限有问题了
                raise Exception("the file is not exist,and can not create it")
        else:
            if existAndDelete:
                if not self.removeDbFile():
                    raise Exception("can not delete the file")
                self.createDb()     #成功删除了旧数据库，现在来创建新的数据库
                if not self.checkDbFileExist():  #检查下新数据库是否创建成功，
                    raise Exception("the file is not exist,and can not create it")
        

    
    def createDb(self):
        '''
        创建数据库，并建表
        '''
        conn = sqlite3.connect(self.mDbFilePath)
        conn.execute(StringDatabaseManager.REGISTER_SQL)
        conn.execute(StringDatabaseManager.TRANSLATE_SQL)
        conn.close()

    def getConn(self):
        '''
        获取一个数据库连接
        '''
        return sqlite3.connect(self.mDbFilePath);

    def checkDbFileExist(self):
        '''
        检查数据文件是否存在
        return 如果存在返回True,不存在则返回False
        '''
        if os.path.isfile(self.mDbFilePath):
            return True
        else:
            return False


    def removeDbFile(self):
        '''
        删除数据文件
        return 删除成功返回True,否则返回False
        '''
        try:
            os.remove(self.mDbFilePath)
            return True
        except Exception,e:
            print u"数据库文件被其他程序占有，无法删除。" + e.message
            return False

    def save(self,childNodeRoot,langCat):
        '''
        字符串存入到数据库中  这个是在子线程上运行的
        dbConn  数据库连接
        childNodeRoot 要存入的xml节点
        langCat 语言环境
        '''
        attrs = childNodeRoot.attrib
        content = "" if childNodeRoot.text == None else childNodeRoot.text.replace("'","''")
        print "content is :" + content 
        name = attrs['name']
        print "name is :" + name
        msgid = attrs['msgid'] if attrs.has_key('msgid') else -1
        formatted = decodeBooleanToInt(attrs['formatted']) if attrs.has_key('formatted') else -1
        print "formatted=>" + (str)(formatted)
        translatable = decodeBooleanToInt(attrs['translatable']) if attrs.has_key('translatable') else -1
        print "translatable=>" + (str)(translatable)
        
        resStringSql = "insert into res (name,resType,msgid,formatted,translatable) values ('%s',1,%d,%d,%d);"%(name,(long)(msgid),formatted,translatable)
        print "resStringSql=>" + resStringSql
        detailStringSql = "insert into detail (name,langType,content) values ('%s','%s','%s')"%(name,langCat,content)
        print "detailStringSql=>" + detailStringSql

        self.mLock.acquire() #拿来一把锁
        dbConn = self.getConn()
        dbConn.execute(resStringSql)
        dbConn.execute(detailStringSql)
        dbConn.close()
        self.mLock.release()